#include "udpserv.h"

/*
void test()//文件测试代码
{
    FILE *file = fopen("example.txt", "w"); // 打开文件用于写入，如果文件不存在则创建  
    const char *text = "Hello, World!\nabcd\nccpwepcww\ncewdfwe\n";  
    fprintf(file, "%s", text); // 写入字符串到文件
    fclose(file);//文件没关闭的话，数据依旧在文件缓冲区中
    
    FILE *fp = fopen("example.txt", "r"); // 打开文件用于读取  
    if (file == NULL) 
    {  
        perror("Error opening fp");  
        return 1;  
    }  
  
    char buffer[100]={0};  
    while (1) 
    {
        char* s = fgets(buffer, 100, fp); 
        if(s)
            cout<<buffer; // 打印从文件中读取的每一行  
        else break;
    }  
}
*/


string info(string message)//服务器对一般信息的处理
{
    return "不想鸟你,傻鸟";
}
string command(string message)//服务器对命令的解析
{
    FILE* fp = popen(message.c_str(),"r");//会将命令的结果回显到文件
    //popen的功能
    //1.创建管道（父进程可以通过该管道向子进程发送输入（指令），同时也可以从该管道接收子进程执行命令的输出结果（文件）。）
    //2.创建子进程（子进程程序替换执行参数一的命令）
    
    if(fp==nullptr)
    {
        return "popen error!!!";
    }
    char buffer[default_size];
    string ret;
    while(1)
    {
        char* s=fgets(buffer,sizeof(buffer)-1,fp);//采用重写缓冲区的形式从文件中读取每一行数据
        if(!s) break;
        else ret+=buffer;
    }
    return ret.empty()?"not find,please continue":ret;
    pclose(fp);
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "格式错误\n正确格式:" << argv[0] << " port" << endl;
    }
    uint16_t port = atoi(argv[1]);

    unique_ptr<udp_server> user(new udp_server(port,command)); // 自动析构
    user->init();
    user->start();

    return 0;
}